package br.com.games.hefesto;

import java.util.List;

/**
 * Definição de um jogador do jogo 
 * 
 * @param <Holder> Tipo usado para manter o estado do jogo
 * @param <Moveable> Objeto que pode ser lancado durante o jogo
 * 
 * @since 2013
 * @author <li><em>fernando.schindler@gmail.com</em></li>
 */
public interface Player<Holder extends State, Moveable> { 
	/**
	 * Lista com os movimentos validos
	 * @return {@link List<Move>} com os movimentos validos
	 */
	List<Move<Moveable>> getValidMoves(Game<Holder, Moveable> game);

	/**
	 * Indicará qual time é do jogador atual
	 * @return {@link Team}
	 */
	Team getTeam();

	/**
	 * O que esse jogador acha dessa posição?
	 * @param state Estado atual do jogo
	 * @return {@link Integer} 
	 */
	Short evaluate(Game<Holder, Moveable> game);

	/**
	 * Indica se o jogado desistiu da partida
	 * @return
	 */
	boolean giveUp();
	
	/**
	 * Retorna seu melhor movimento
	 * @param game
	 * @return {@link Move}
	 */
	Move<Moveable> getMove(Game<? extends Holder, Moveable> game);
	
	/**
	 * Player's name
	 * @return it's name
	 */
	String getName();
	
	/**
	 * Descrição do time
	 * @return {@link String}
	 */
	String getDescription();
}
